/* 
 * Funkcijos išskirti atminčiai
 */
#ifndef KERNELHEAP_H
#define KERNELHEAP_H

#include "ordarray.h"

/* Header'io struktūra */
typedef struct{
  u32int magic;    /* Numeris skirtas tikrinti klaidoms ir indentifikuoti */
  u8int is_hole;   /* Jei 1 tai skyle, jei 0 tai blokas */
  u32int size;     /* Bloko dydis footer'į įskaičiavus */
} header_t;

/* Footer'io struktūra */
typedef struct{
  u32int magic;     /* Numeris skirtas tikrinti klaidoms ir indentifikuoti */
  header_t *header; /* Pointeris į bloko header'į*/
} footer_t;

/* Heap'o struktūra */
typedef struct{
  ord_arr_t index;  /* Masyvas */
  u32int startaddr; /* Pradžia paskirtos atminties */
  u32int endaddr;   /* Pabaiga paskirtos atminties. Gali prasiplėsti iki maxaddr */
  u32int maxaddr;   /* Maksimalus adresas galimas */
  u8int supervisor; /* Ar papildomi paprašyti puslapiai turi būti priskirti tik supervisoriui? */
  u8int readonly;   /* Ar papildomi paprašyti puslapiai turi būti priskirti kaip TIK skaitymui?*/
} heap_t;

/* Sukuria heap'ą */
heap_t *create_heap(u32int , u32int , u32int , u8int , u8int );
/* Priskiria atminties bloką nurodyto dydžio. 
 * Jei nurodyta kad page_align rekia, tai sukuria nuo pradžios */
void *alloc(u32int , u8int , heap_t *); 
void free(void *, heap_t *); /* Išlaisvinti bloka sukurta su alloc */
u32int kmalloc_internal(u32int , int , u32int *); /* Esminė funkcija, naudojama visų kitų */
u32int kmalloc_align(u32int );  /* Su išlygiavimu, be fizinio adreso grąžinimo */
u32int kmalloc_physical(u32int , u32int *); /* Grąžina fizinį adresa, be išlygiavimo */
u32int kmalloc_align_physical(u32int , u32int *); /* Su išlygiavimu ir grąžina fizinį adresą */
u32int kmalloc(u32int ); /* Be išlygiavimo ir išsaugojimo */ 
void kfree(void *); /* Išlaisvinimo funkcija */

#endif /* KERNELHEAP_H */
